package org.finesys.common.netty.websocket.resolver;

import io.netty.channel.Channel;
import org.finesys.common.netty.websocket.annotation.OnEvent;
import org.finesys.common.netty.websocket.support.MethodArgumentResolver;
import org.springframework.beans.TypeConverter;
import org.springframework.beans.factory.support.AbstractBeanFactory;
import org.springframework.core.MethodParameter;

public class EventMethodArgumentResolver implements MethodArgumentResolver {

    private final AbstractBeanFactory beanFactory;

    public EventMethodArgumentResolver(AbstractBeanFactory beanFactory) {
        this.beanFactory = beanFactory;
    }

    /**
     * 重写support方法以判断是否支持给定的方法参数。
     *
     * 如果方法参数上标注了@OnEvent注解，则返回true，表示支持该参数；
     * 否则返回false。
     *
     * @param parameter 方法参数，包含方法参数的元数据。
     * @return 如果支持给定的方法参数，则返回true；否则返回false。
     */
    @Override
    public boolean support(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(OnEvent.class);
    }

    /**
     * 重写resolveArgument方法以解析方法参数。
     *
     * 根据传入的对象和方法参数类型，使用beanFactory中的TypeConverter进行类型转换，并将转换后的对象作为方法参数返回。
     * 如果传入的对象为null，则直接返回null。
     *
     * @param parameter 方法参数，包含方法参数的元数据。
     * @param channel   WebSocket通道，用于处理WebSocket连接。本方法中未使用此参数。
     * @param object     从WebSocket通道接收到的对象，需要进行类型转换。
     * @return 转换后的对象，类型与方法参数类型匹配。
     * @throws Exception 如果在类型转换过程中发生异常，则抛出该异常。
     */
    @Override
    public Object resolveArgument(MethodParameter parameter, Channel channel, Object object) throws Exception {
        if (object == null) {
            return null;
        }
        TypeConverter typeConverter = beanFactory.getTypeConverter();
        return typeConverter.convertIfNecessary(object, parameter.getParameterType());
    }
}
